/*
 * MembroDoAgregado.java
 *
 * Created on 14 de Maio de 2007, 17:52
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package pt.iscte.dcti.es.rhplus.utilizador;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.LinkedList;

import pt.iscte.dcti.es.rhplus.sistema.CodigoPostal;
import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

/**
 * 
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public class MembroDoAgregado extends Utente {

	/** Creates a new instance of MembroDoAgregado */
	public MembroDoAgregado(final int id_pessoa, final String nome, final char sexo, final int bi, final Date data_de_nascimento, final int nif,
			final String email, final int telefone, final int telemovel, final String morada, final String grupo_sanguineo,
			final CodigoPostal codigo_postal, final LinkedList<TratamentoPassado> lista_de_tratamentos_passados,
			LinkedList<DoencaPassada> lista_de_doencas_passadas) {

		super(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel, morada, grupo_sanguineo, codigo_postal,
				lista_de_tratamentos_passados, lista_de_doencas_passadas);
	}

	public static MembroDoAgregado devolve(final String username) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("visualizar_membro_do_agregado_por_username");
		Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
		dados_da_pessoa.put("var_username", username);
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_pessoa);

		result_set.next();

		int id_pessoa = result_set.getInt("id_pessoa");
		int id_codigo_postal = result_set.getInt("id_codigo_postal");

		// Cria o Membro do Agregado e os outros elementos necessarios
		CodigoPostal codigo_postal = CodigoPostal.devolve(id_codigo_postal);
		LinkedList<TratamentoPassado> lista_de_tratamentos_passados = TratamentoPassado.devolveTodosDoUtente(id_pessoa);
		LinkedList<DoencaPassada> lista_de_doencas_passadas = DoencaPassada.devolveTodasDoUtente(id_pessoa);

		MembroDoAgregado membro_do_agregado = new MembroDoAgregado(result_set.getInt("id_pessoa"), result_set.getString("nome"), result_set
				.getString("sexo").charAt(0), result_set.getInt("bi"), result_set.getDate("data_de_nascimento"), result_set.getInt("nif"), result_set
				.getString("email"), result_set.getInt("telefone"), result_set.getInt("telemovel"), result_set.getString("morada"), result_set
				.getString("grupo_sanguineo"), codigo_postal, lista_de_tratamentos_passados, lista_de_doencas_passadas);

		acesso_bd.fechaLigacao();

		return membro_do_agregado;
	}

	public static MembroDoAgregado devolve(final int id_pessoa) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("visualizar_membro_do_agregado_por_id_pessoa");
		Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
		dados_da_pessoa.put("var_id_pessoa", id_pessoa);
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_pessoa);

		result_set.next();

		int id_codigo_postal = result_set.getInt("id_codigo_postal");

		// Cria o Membro do Agregado e os outros elementos necessarios
		String nome = result_set.getString("nome");

		char sexo = result_set.getString("sexo").charAt(0);
		int bi = result_set.getInt("bi");
		Date data_de_nascimento = result_set.getDate("data_de_nascimento");
		int nif = result_set.getInt("nif");
		String email = result_set.getString("email");
		int telefone = result_set.getInt("telefone");
		int telemovel = result_set.getInt("telemovel");
		String morada = result_set.getString("morada");
		String grupo_sanguineo = result_set.getString("grupo_sanguineo");

		CodigoPostal codigo_postal = CodigoPostal.devolve(id_codigo_postal);
		LinkedList<TratamentoPassado> lista_de_tratamentos_passados = TratamentoPassado.devolveTodosDoUtente(id_pessoa);
		LinkedList<DoencaPassada> lista_de_doencas_passadas = DoencaPassada.devolveTodasDoUtente(id_pessoa);

		MembroDoAgregado membro_do_agregado = new MembroDoAgregado(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel,
				morada, grupo_sanguineo, codigo_postal, lista_de_tratamentos_passados, lista_de_doencas_passadas);

		acesso_bd.fechaLigacao();

		return membro_do_agregado;
	}

	public static LinkedList<MembroDoAgregado> devolveTodosDoCliente(final int id_titular) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("devolver_membros_do_agregado_do_cliente");
		Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
		dados_da_pessoa.put("var_id_titular", id_titular);
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_pessoa);

		LinkedList<MembroDoAgregado> lista_de_membros_do_agregado = new LinkedList<MembroDoAgregado>();

		while (result_set.next()) {

			// Cria o Membro do Agregado e os outros elementos necessarios
			int id_pessoa = result_set.getInt("id_pessoa");

			MembroDoAgregado membro_do_agregado = MembroDoAgregado.devolve(id_pessoa);

			lista_de_membros_do_agregado.add(membro_do_agregado);
		}

		acesso_bd.fechaLigacao();

		return lista_de_membros_do_agregado;
	}

	public static void insere(final Hashtable<String, Object> dados_membro_do_agregado) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		// Insere a parte de utente do membro do agregado (Pessoa)
		Utente.insere(dados_membro_do_agregado);

		int ultimo_id_pessoa = devolveUltimoIdentificadorDeInsercao();

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("inserir_membro_do_agregado");
		dados_membro_do_agregado.put("var_id_pessoa", new Integer(ultimo_id_pessoa));
		acesso_bd.executaUpdate(qryName, dados_membro_do_agregado);
		acesso_bd.fechaLigacao();

	}

	public static void remove(final int id_pessoa) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		// Remove da tabela do membro do agregado.
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("remover_membro_do_agregado");
		Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
		dados_da_pessoa.put("var_id_pessoa", new Integer(id_pessoa));

		acesso_bd.executaUpdate(qryName, dados_da_pessoa);
		acesso_bd.fechaLigacao();

		// Remove da tabela Pessoa.
		Utente.remove(id_pessoa);

	}

	public void gravaParaBaseDeDados() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		super.gravaParaBaseDeDados();
	}

}
